package com.tedu.api.list;

import org.junit.Test;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

/**
 * Collection集合下  子集合【叫队列】
 * Queue  队列      单端队列
 * Deque  队列      双端队列   "Deque接口--继承--Queue接口"
 * 作用：保存数据，有序存储和处理   功能：数据缓存或者多线程协调工作！
 *
 * 队列实现类：
 * LinkedList:双向链表
 *
 */
public class QueueAPI {
    //Queue   队列     单端队列
    @Test
    public void testQueue(){
        //创建队列--多态--LinkedList
        Queue<String> queue=new LinkedList<>();
        /**
         * offer()   ----add()一样
         * 作用：入队操作，对尾追加元素
         */
        queue.offer("青花瓷");
        queue.offer("东眠");
        queue.offer("我的滑板鞋");
        queue.offer("体面");
        System.out.println("Queue队列:"+queue);
        /**
         * poll()
         * 作用：出队操作，获取对首元素，并且删除队列中对首
         */
        queue.poll();queue.poll();//删除队首元素
        System.out.println("Queue队列:"+queue);
        String str= queue.peek();
        System.out.println("队首元素："+str);
        System.out.println("Queue队列："+queue);
        /**
         * 需求：1.遍历队列--while--只遍历一次队列【队列元素消失】
         *     提示：while 条件：拿掉队列中总长度 size()>0
         * 需求：2.遍历队列--增强for--队列元素不消失
         *     提示：for 条件：E e：队列
         */
//        while (queue.size() > 0) { //true:队伍总列>0 队列有元素 遍历
//            str= queue.poll(); //获取队首，删除队首
//            System.out.println("获取队列操作："+str);
//        }
//        System.out.println("Queue队列元素："+queue);
        /**
         * 需求：2.遍历队列--增强for--队列元素不消失
         *    提示：for 条件：E e：队列
         */
        for (String e :queue){
            System.out.println("队列元素："+e);
        }
        System.out.println("Queue队列元素："+queue);
    }
    @Test
    public void testDeque(){
        //创建Deque 创建双端队列   方法基本一致，部分方法不一致
        Deque<String> deque=new LinkedList<>();
        deque.offer("任贤齐");deque.offer("王菲");deque.offer("毛阿敏");deque.offer("那英");
        System.out.println("双端队列："+deque);
        //offerFirst()    队首添加元素  OfferLast() 队尾添加元素
        deque.offerFirst("蔡徐坤");  deque.offerLast("薛之谦");
        System.out.println("双端队列【首尾添加元素】："+deque);
        //getFrist() 获取队首  getLast() 获取队尾
        System.out.println("获取队列中的队首："+deque.getFirst());
        System.out.println("获取队列中的队尾："+deque.getLast());
        //pollFirst()  获取队首，删除队列中队首
        //pollLast()  获取队尾，删除队列中队尾
        String xue=deque.pollLast(); //删除‘薛之谦’元素 队列--队首
        System.out.println("队尾元素："+xue);
        System.out.println("双端队列："+deque);



    }
    /**
     * 找结构：业务中如果有后退【撤销】
     * 双端队列支持栈结构---提供想要的方法实现栈结构
     */
    @Test
    public void testStack(){
        //创建双端队列--支持栈结构
        Deque<String> stack=new LinkedList<>();
        /**
         * push()   Deque  独有的方法--支持栈结构
         * --offer:Queue---add：Collection接口   【添加】
         * 作用：【添加：往栈压入一个元素】压栈操作
         */
        stack.push("夯大力");
        stack.push("恶搞之家");
        stack.push("喜羊羊");
        stack.push("魔方大厦");
        System.out.println("栈结构："+stack);
        /**
         * pop()  出栈一个尾元素 --pollLast类似【先拿入后出，最后一个压栈元素
         *
         */
        String last= stack.pop();
        System.out.println("出栈尾元素:"+last);
        System.out.println("栈结构："+stack);
        //面试题：pop,poll,peek的使用区别
        /**
         * 需求1：遍历栈结构--while---元素出栈，队列元素需要清空
         * 需求2：遍历栈结构--增强for--元素遍历成功，队列元素不变
         */
//        while(stack.size()>0){
//            String s=stack.pop();
//            System.out.println("while循环遍历："+s);
//        }
//        System.out.println("删除以后："+stack);
        for (String st:stack){
            System.out.println("for循环遍历"+st);
        }
    }
}

